﻿#ifndef LK_WINDOWS_UI_HFONT_
#define LK_WINDOWS_UI_HFONT_
namespace LK
{
	namespace Windows
	{
		namespace UI
		{
			/**
			@brief 字体风格类*/
			struct HFontStyle
			{
				/**
				@brief 字体大小*/
				int Weight;
				/**
				@brief 斜体*/
				bool IsItalic;
				/**
				@brief 下划线*/
				bool HasUnderline;
				/**
				@brief 删除线*/
				bool HasStrikeOut;
				/**
				@brief 使用字体大小、是否斜体、是否有下划线、是否有删除线来初始化*/
				HFontStyle(int wetght, bool italic, bool underline, bool strikeOut) :Weight(wetght), IsItalic(italic), HasUnderline(underline), HasStrikeOut(strikeOut){}
				friend inline HFontStyle operator|(HFontStyle const& a, HFontStyle const& b){ return HFontStyle(a.Weight | b.Weight, a.IsItalic || b.IsItalic, a.HasUnderline || b.HasUnderline, a.HasStrikeOut || b.HasStrikeOut); }
				/**
				@brief 加粗文字*/
				static const HFontStyle Bold;
				/**
				@brief 斜体文字*/
				static const HFontStyle Italic;
				/**
				@brief 细体文字*/
				static const HFontStyle Thin;
				/**
				@brief 常规文字*/
				static const HFontStyle Regular;
				/**
				@brief 删除线文字*/
				static const HFontStyle Strikeout;
				/**
				@brief 下划线文字*/
				static const HFontStyle Underline;
			};
			/**
			@brief 字体信息类*/
			class HFont
			{
				HFONT hFont;
			//	LOGFONTW lFont;
			public:
				/**
				@brief 使用详细的参数构造HFONT*/
				HFont(int nHeight,//指定字体的字符单元或字符的逻辑单位高度
					int nWidth,//指定所要求字体的字符的逻辑单位的平均宽度。如果此值为0，字体映射器选择一个closest match值
					int nEscapement,//指定移位向量和设备X轴之间的一个角度，以十分之一度为单位
					int nOrientation,//指定每个字符的基线和设备X轴之间的角度
					int fnWeight,//在0到1000之间指定字体的权值，如400表示标准体，700表示黑（粗）体，如果此值为0，则使用缺省的权值
					DWORD fdwItalic,//如果设置为TRUE，则字体设置为斜体。
					DWORD fdwUnderline,//如果设置为TRUE，则字体增加下划线。
					DWORD fdwStrikeOut,//如果设置为TRUE，则字体增加删除线。
					DWORD fdwCharSet,//指定字符集，OEM_CHARSET指定的字符集与操作系统有关，可以使用DEFAULT_CHARSET值来允许字体的名字和大小来充分描述逻辑字体
					DWORD fdwOutputPrecision,//指定输出精度，输出精度义输出与要求的字体高度、宽度、字符定位、移位、字符间距和字符类型的匹配程序,可以用OUT_DEFAULT_PRECIS
					DWORD fdwClipPrecision,//指定裁剪精度，裁剪精度定义如何裁剪部分超出裁剪区的字符，它可取一个或多个下列值：	CLIP_DEFAULT_PRECIS：指定缺省裁剪状态。
					DWORD fdwQuality,//指向输出质量，输出质量定义GDI如何仔细地将逻辑字体属性与实际物理字体属性相匹配。它可取下列值之一：DEFAULT_QUALITY：字体的外观不重要
					DWORD fdwPitchAndFamily,/*指定字体间距和字体族低端二位指定字体的字符间距，它可取下列值之一：
					DEFAULT_PITCH；FIXED_PITCH; VARIABLE_PITCH
					高端四位指定字体族，可取下列值之一：
					FF_DECORATIVE：新奇的字体，如老式英语（Old English）。
					FF_DONTCARE：不关心或不知道。
					FF_MODERN：笔划宽度固定的字体，有或者无衬线。如Pica、Elite和Courier New。
					FF_ROMAN：笔划宽度变动的字体，有衬线。如MS Serif。
					FF_SCRIPT：设计成看上去象手写体的字体。如Script和Cursive。
					FF_SWISS：笔划宽度变动的字体，无斜线。如MS Sans Serif。*/
					LPCWSTR lpszFace//指向指定字体的字样名的、以\0结束的字符串指针，字符串的长度不能超过32个字符（包括字符\0），函数EnumFontFamilies可用来列举所有当前可用字体的字样名。
					) :hFont(CreateFontW(nHeight, nWidth, nEscapement, nOrientation, fnWeight, fdwItalic, fdwUnderline, fdwStrikeOut, fdwCharSet, fdwOutputPrecision, fdwClipPrecision, fdwQuality, fdwPitchAndFamily, lpszFace))
				{
					if (hFont == NULL)throw PWindowsException(GetLastError());
				}

				/**
				@brief 使用指定的字体和字体高度、粗度、斜体、下划线删除线信息进行初始化*/
				HFont(PString const& str, int nHeight, int fnWeight= FW_REGULAR,DWORD fdwItalic=0,DWORD fdwUnderline=0,DWORD fdwStrikeOut=0) :hFont(CreateFontW(nHeight, 0, 0, 0, fdwItalic, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, str))
				{
					if (hFont == NULL)throw PWindowsException(GetLastError());
				}
				/**
				@brief 从HFONT初始化*/
				HFont(HFONT hf) :hFont(hf)
				{
					if (hFont == NULL)throw PWindowsException(GetLastError());
				}
				/**
				@brief 到字体句柄的转换*/
				operator HFONT()const{ return hFont; }
				/**
				@brief 获取字体信息*/
				void GetHFontInfo(LOGFONTW*out);
				/**
				@brief 获取系统字体*/
				static HFont GetSystemFont(int index= SYSTEM_FONT);
			};
		}
	}
}
#endif
